package cn.good.yan.basics.t6.scheduled.tank;

import cn.good.yan.basics.t6.scheduled.service.SchService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.PeriodicTrigger;
import org.springframework.stereotype.Component;

import java.util.concurrent.Executors;

/**
 * 定时任务
 * @author shengren.yan
 * @create 2022-12-20
 */
@Component
@EnableScheduling
public class TJob implements SchedulingConfigurer {

    private static final Logger logger = LogManager.getLogger(TJob.class);

    @Autowired
    private SchService schService;

    // 单位毫秒  （20 毫秒）
    private long timer = 30 * 1000;


    /**
     * 执行定时任务
     *
     * @param taskRegistrar 计划任务注册
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        try {
//            taskRegistrar.setScheduler(Executors.newScheduledThreadPool(50)); // 设置线程个数
            logger.info("Job启动");
            // 参数1，1.添加任务内容(Runnable) - schService::execute
            // 参数2  2.设置执行周期(Trigger)
            taskRegistrar.addTriggerTask(schService::execute, triggerContext -> {
                // 2.1 从数据库获取执行周期 (查询 要循环的日期)
                // 2.2 合法性校验.
//                if (StringUtils.isEmpty(cron)) {
//                    // Omitted Code ..
//                }
                // 2.3 返回执行周期(Date)
                // 此处使用不同的触发器，为设置循环时间的关键，区别于CronTrigger触发器，该触发器可随意设置循
                // 环间隔时间，单位为毫秒
                PeriodicTrigger periodicTrigger = new PeriodicTrigger(timer);
                return periodicTrigger.nextExecutionTime(triggerContext);
//                String cron = "0/5 * * * * ? "; // cron表达式的启动
//                return new CronTrigger(cron).nextExecutionTime(triggerContext);
            });
            logger.info("job结束");
        } catch (Exception ex) {
            logger.error(String.format(" 运行失败：%s", ex.getMessage()));
        }
    }

}
